home *** CD-ROM | disk | FTP | other *** search
- # include <ingres.h>
- # include <btree.h>
- # include <sccs.h>
-
- SCCSID(@(#)btreerange.c 8.1 12/31/84)
-
- /*
- ** Btreerange finds the smallest and largest tids corresponding to
- ** the lids found between two given lids.
- */
-
- btreerange(d, low_lid, high_lid, lotid, hitid)
-
- DESC *d;
- long low_lid[], high_lid[];
- register TID *lotid, *hitid;
- {
- register int i;
- long l, h, tid, temp;
- struct locator block;
- long page, t, last, hbtid, last_lid();
- int done, first;
- long start, next;
-
- /* find tid corresponding to high lid */
- page = RT;
- for (i = 0; i < d->reldum.reldim; ++i)
- {
- if ((t = get_tid(page, high_lid[i], &block)) < 0)
- syserr("get_tid error in btreerange, lid = %ld\n", high_lid[i]);
- page = t;
- }
- hbtid = page;
- /* find starting point of scan */
- page = RT;
- for (i = 0; i < d->reldum.reldim - 1; ++i)
- {
- last = last_lid(page) - 1;
- if (low_lid[i] > last)
- low_lid[i] = last;
- if ((t = get_tid(page, low_lid[i], &block)) < 0)
- syserr("get_tid error in btreerange, lid = %ld\n", low_lid[i]);
- page = t;
- }
- first = 1;
- last = last_lid(page) - 1;
- if (low_lid[d->reldum.reldim - 1] > last)
- low_lid[d->reldum.reldim - 1] = last;
- start = low_lid[d->reldum.reldim - 1];
- do
- {
- get_node(page, &block.page);
- next = block.page.nexttree;
- if ((tid = get_tid(page, start, &block)) < 0)
- syserr("get_tid error in btreerange, lid = %ld\n", low_lid[d->reldum.reldim - 1]);
- /* set high and low to intial value */
- if (first)
- {
- first = 0;
- pluck_page(&tid, &l);
- pluck_page(&tid, &h);
- }
- page = block.pageno;
- done = 0;
- while (done == 0)
- {
- for (i = 0; i < block.page.nelmts && done == 0; ++i)
- {
- tid = block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[i]];
- pluck_page(&tid, &temp);
- if (temp > h)
- h = temp;
- else if (temp < l)
- l = temp;
- if (tid == hbtid)
- done = 1;
- }
- page = block.page.node.leafnode.nextleaf;
- if (page == (long)NULL)
- done = 1;
- else
- get_node(page, &block.page);
- }
- start = 1;
- } while (page = next && !done);
- stuff_page(lotid, &l);
- stuff_page(hitid, &h);
- lotid->line_id = hitid->line_id = -1;
- }
-